package string;

public class StringDemo03 {
    public static void main(String[] args) {
        /**
         * String 常量池优化现象
         */
        // java 第一次会创建字符串"ABC"对象, 并且缓存到常量池
        String s1 = "ABC";
        // 第二次以后使用 “ABC”时候， 就重复利用常量中的 "ABC"
        String s2 = "ABC";
        //结果就是 s1 和 s2 指向同一个字符串对象
        System.out.println(s1 == s2); //true

        //Java编译器会优化计算字面量连接，将"AB"+"C" 优化为 "ABC"
        // 运行时候 就是 静态的“ABC”，也会重复利用常量中的 "ABC"
        String s3 = "AB"+"C";
        //结果就是 s1 和 s3 指向同一个字符串对象
        System.out.println(s1 == s3); //true

        /**
         * 动态创建的字符串, 不会复用常量池中的字符串对象
         */
        //使用 new 创建的字符串对象，不会复用常量池中的对象
        String s4 = new String("ABC");
        //s1 和 s4 指向的不是同一个对象
        System.out.println(s1 == s4); //false

        String s5 = "AB";
        //字符串变量的连接时候， 会创建新字符串对象，并且不会复用
        //常量池中的字符串对象
        String s6 = s5+"C";
        //s1 和 s6 指向的不是同一个对象
        System.out.println(s1 == s6); //false

        // 第二次以后使用 “ABC”时候， 就重复利用常量中的 "ABC"
        String s7 = "ABC";
        //结果是 s1 和 s7 指向同一个字符串对象
        System.out.println(s1 == s7);

        /**
         * 上述案例说明 == 不能用于判断字符串内容是否一样
         * == 只能判断变量是否指向一个对象
         * 字符串上提供了 equals 方法用于比较两个字符串内容是否相同
         * 重要使用规则：比较字符串是否相等时候，要使用equals方法！
         */
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s6);
        System.out.println(s7);
        System.out.println(s1.equals(s2));
        System.out.println(s1.equals(s6));
        System.out.println(s1.equals(s7));
        System.out.println(s1.equals(s5)); //false
    }
}
